Przewidywanie satysfakcji klientów linii lotniczej

Autor

Weronika Nadworska

Wstęp oraz cel badania

Każdego dnia na całym świecie odbywa się około 100 000 lotów pasażerskich, co skutkuje podróżami około 6 milionów osób dziennie. Analizowany zbiór danych zawiera informacje pozyskane od około 100 tys. pasażerów na temat satysfakcji z odbytego lotu samolotem. W tym badaniu przeprowadzona zostanie eksploracyjna analiza danych, zaprezentowane będą wizualizacje zbioru oraz zbudowany zostanie model predykcyjnego poziomu satysfakcji z odbytego lotu.

Poniżej zaprezentowano opis poszczególnych zmiennych:

  • Gender: płeć pasażerów (Female, Male)

  • Customer Type: typ klienta (Loyal customer, disloyal Customer)

  • Age: wiek pasażera

  • Type of Travel: powód lotu pasażera (Personal travel, Business travel)

  • Class: klasa w samolocie podczas lotu pasażera (Business, Eco, Eco Plus)

  • Flight distance: przebyty dystans podczas podróży

  • Inflight wifi service: poziom zadowolenia z usługi wifi podczas lotu (0 - nie dotyczy ;1 - 5)

  • Departure/Arrival time convenient: poziom zadowolenia z dogodnego czasu odlotu/przylotu (1 - 5)

  • Ease of Online booking: poziom zadowolenia z rezerwacji online (1 - 5)

  • Gate location: poziom zadowolenia z lokalizacji bramy (1 - 5)

  • Food and drink: poziom zadowolenia z jedzenia oraz picia (1 - 5)

  • Online boarding: poziom zadowolenia z odprawy online (1 - 5)

  • Seat comfort: poziom zadowolenia z komfortu siedzenia (1 - 5)

  • Inflight entertainment: poziom zadowolenia z rozrywki pokładowej (1 - 5)

  • On-board service: poziom zadowolenia z usług pokładowych (1 - 5)

  • Leg room service: poziom zadowolenia z obsługi pokoju Leg (1`- 5)

  • Baggage handling: poziom zadowolenia z obsługi bagażu (1 - 5)

  • Check-in service: poziom zadowolenia z usługi odprawy (1 - 5)

  • Inflight service: poziom zadowolenia z obsługi podczas lotu (1 - 5)

  • Cleanliness: poziom zadowolenia z czystości (1 - 5)

  • Departure Delay in Minutes: minuty opóźnienia podczas odlotu

  • Arrival Delay in Minutes: minuty opóźnienia po przylocie

  • satisfaction: poziom zadowolenia z linii lotniczych (satisfied, neutral or dissatisfied)

Preprocessing

Opis zbioru badawczego

Wstępna struktura danych przedstawia się następująco:

'data.frame':   103904 obs. of  26 variables:
 $ X.1                              : int  1 2 3 4 5 6 7 8 9 10 ...
 $ X                                : int  0 1 2 3 4 5 6 7 8 9 ...
 $ id                               : int  70172 5047 110028 24026 119299 111157 82113 96462 79485 65725 ...
 $ Gender                           : chr  "Male" "Male" "Female" "Female" ...
 $ Customer.Type                    : chr  "Loyal Customer" "disloyal Customer" "Loyal Customer" "Loyal Customer" ...
 $ Age                              : int  13 25 26 25 61 26 47 52 41 20 ...
 $ Type.of.Travel                   : chr  "Personal Travel" "Business travel" "Business travel" "Business travel" ...
 $ Class                            : chr  "Eco Plus" "Business" "Business" "Business" ...
 $ Flight.Distance                  : int  460 235 1142 562 214 1180 1276 2035 853 1061 ...
 $ Inflight.wifi.service            : int  3 3 2 2 3 3 2 4 1 3 ...
 $ Departure.Arrival.time.convenient: int  4 2 2 5 3 4 4 3 2 3 ...
 $ Ease.of.Online.booking           : int  3 3 2 5 3 2 2 4 2 3 ...
 $ Gate.location                    : int  1 3 2 5 NA 1 3 4 2 4 ...
 $ Food.and.drink                   : int  5 1 5 2 4 1 2 5 4 2 ...
 $ Online.boarding                  : int  3 3 5 2 5 2 2 5 3 3 ...
 $ Seat.comfort                     : int  5 1 5 2 5 1 2 5 3 3 ...
 $ Inflight.entertainment           : int  5 1 5 2 3 1 2 5 1 2 ...
 $ On.board.service                 : int  4 1 4 2 3 3 3 5 1 2 ...
 $ Leg.room.service                 : int  3 5 3 5 4 4 NA 5 2 3 ...
 $ Baggage.handling                 : int  4 3 4 3 4 4 4 5 1 4 ...
 $ Checkin.service                  : int  4 1 4 1 3 4 3 NA 4 4 ...
 $ Inflight.service                 : int  5 4 4 4 3 4 5 5 1 3 ...
 $ Cleanliness                      : int  5 1 5 2 3 1 2 4 2 2 ...
 $ Departure.Delay.in.Minutes       : int  25 1 0 11 0 0 9 4 0 0 ...
 $ Arrival.Delay.in.Minutes         : int  18 6 0 9 0 0 23 0 0 0 ...
 $ satisfaction                     : chr  "neutral or dissatisfied" "neutral or dissatisfied" "satisfied" "neutral or dissatisfied" ...

Dane zawierają zatem 103904 obserwacji, które opisuje 26 zmiennych. Widoczne są zmienne X.1, X oraz id, które są indeksami wierszy. Wyminienione 3 kolumny zostaną usunięte ze zbioru, ponieważ nie wnoszą one żadnych informacji nt. danych, a format data.frame w R automatycznie indeksuje wiersze.

Dodatkowo, dostrzec można również zmienne zawierające ciągi znaków, które są zakodowane jako typ char (znakowy), co jest oczywiście logiczne, jednak każda z tych zmiennych ma swoje unikalne kategorie (wnioskując z opisu zmiennych), dlatego ich typ zostanie zmieniony na factor (kategoryczny). Poza tym, w dalszych etapach zakodowanie ich w ten sposób znacząco ułatwi analizę. Są to zmienne: Gender, Customer.Type, Type.of.Travel, satisfaction oraz Class.

Zatem zmienna Gender ma poziomy: 1 - Female, 0 - Male, Customer.Type : 0 - disloyal Customer, 1 - Loyal Customer, Type.of.Travel: 1 - Business travel, 0 - Personal Travel, Class: 1 - Eco, 2 - Eco Plus, 3 - Business, satisfaction: 0 - neutral or dissatisfied, 1 - satisfied.

Zmiennymi numerycznymi w tym zbiorze danych są: Age, Flight.Distance, Departure.Delay.in.Minutes, Arrival.Delay.in.Minutes. Pozostałe zostaną zakodowane jako kategoryczne.

Statystyki opisowe

Poniżej zostały przedstawione podstawowe statystyki opisowe dla zmiennych numerycznych.

Age Flight.Distance Departure.Delay.in.Minutes Arrival.Delay.in.Minutes
Min. 7.00 31 0.00 0.00
1st Qu. 27.00 414 0.00 0.00
Median 40.00 842 0.00 0.00
Mean 39.38 1189 14.81 15.19
3rd Qu. 51.00 1741 12.00 13.00
Max. 85.00 4983 1592.00 1584.00
NA's 435 399 439 722

Wnioski:

  • Najmłodszy pasażer w tym zbiorze danych miał 7 lat, a najstarszy 85, jednak średnia oraz mediana wieku wynoszą około 40 lat. Ich wartości są do siebie bardzo zbliżone, co może wstępnie świadczyć o braku asymetrii rozkładu tej zmiennej.

  • Loty zwykle odbywały się na dystans ponad 1000 kilometrów. 75% wszystkich lotów nie przekroczyło dystansu 1741 km. Odbyły się jednak loty, dla których miejsce docelowe było znacznie bardziej oddalone - wartość maksymalna wskazuje na dystans niemal 5 tys. kilometrów. Świadczy to także dodatkowo o asymetrii rozkładu tej zmiennej.

  • Dla zmiennych dotyczących opóźnień lotów, zwykle typowe wartości wynosiły 0 - opóźnienia w lotach nie występowały. 75% analizowanych lotów miało opóźnienie nie przekraczające 13 minut. Wartości maksymalne dla tych zmiennych świadczą jednak o występujących tu wartościach nietypowych - był co najmniej jeden lot, którego opóxnienie przekraczało 1500 minut.

  • Na podstawie powyższej tabeli, można także dostrzec, że każda ze zmiennych numerycznych posiada braki danych, których identyfikacja oraz imputacja będzie przeprowadzona w kolejnym etapie.

Liczby wystąpień poszczególnych poziomów dla zmiennych kategorycznych

Dla zmiennych kategorycznych prezentujemy ich możliwe poziomy, oraz liczby wystąpień każdego poziomu:

Gender Customer.Type Type.of.Travel Class Inflight.wifi.service Departure.Arrival.time.convenient Ease.of.Online.booking Gate.location Food.and.drink Online.boarding Seat.comfort Inflight.entertainment On.board.service Leg.room.service Baggage.handling Checkin.service Inflight.service Cleanliness satisfaction
0 :50972 0 :18907 0 :32122 1 :46531 0 : 3083 0 : 5278 0 : 4469 0 : 1 0 : 107 0 : 2421 0 : 1 0 : 14 0 : 3 0 : 471 1 : 7198 0 : 1 0 : 3 0 : 12 0:58879
1 :52506 1 :84593 1 :71353 2 : 7470 1 :17766 1 :15433 1 :17450 1 :17497 1 :12775 1 :10643 1 :12024 1 :12422 1 :11807 1 :10306 2 :11472 1 :12843 1 : 7049 1 :13255 1:45025
NA's: 426 NA's: 404 NA's: 429 3 :49449 2 :25732 2 :17129 2 :23930 2 :19386 2 :21890 2 :17422 2 :14835 2 :17577 2 :14627 2 :19429 3 :20545 2 :12840 2 :11412 2 :16046
NA's: 454 3 :25770 3 :17898 3 :24357 3 :28461 3 :22214 3 :21718 3 :18631 3 :19054 3 :22742 3 :20015 4 :37212 3 :28312 3 :20206 3 :24475
4 :19698 4 :25431 4 :19494 4 :24344 4 :24254 4 :30619 4 :31638 4 :29294 4 :30741 4 :28670 5 :27027 4 :28930 4 :37783 4 :27053
5 :11420 5 :22297 5 :13783 5 :13817 5 :22222 5 :20641 5 :26355 5 :25099 5 :23571 5 :24572 NA's: 450 5 :20538 5 :27004 5 :22581
NA's: 435 NA's: 438 NA's: 421 NA's: 398 NA's: 442 NA's: 440 NA's: 420 NA's: 444 NA's: 413 NA's: 441 NA's: 440 NA's: 447 NA's: 482

Zmienne dotyczące satysfakcji z lotu mają 5 poziomów. Pozostałe, dotyczące samych pasazerów, zwykle 2-3 poziomy. Dla każdej zmiennej, poza satisfaction, występują braki danych.

Braki danych

Liczba braków danych w każdej z kolumn:

                           Gender                     Customer.Type 
                              426                               404 
                              Age                    Type.of.Travel 
                              435                               429 
                            Class                   Flight.Distance 
                              454                               399 
            Inflight.wifi.service Departure.Arrival.time.convenient 
                              435                               438 
           Ease.of.Online.booking                     Gate.location 
                              421                               398 
                   Food.and.drink                   Online.boarding 
                              442                               440 
                     Seat.comfort            Inflight.entertainment 
                              420                               444 
                 On.board.service                  Leg.room.service 
                              413                               441 
                 Baggage.handling                   Checkin.service 
                              450                               440 
                 Inflight.service                       Cleanliness 
                              447                               482 
       Departure.Delay.in.Minutes          Arrival.Delay.in.Minutes 
                              439                               722 
                     satisfaction 
                                0 
[1] 9819

W niemal wszystkich kolumnach występuje około 400 braków danych. Najwięcej ich występuje w zmiennej Arrival.Delay.in.Munutes. Jedyna zmienna bez braków to satisfaction. W całym zbiorze danych braki stanowią 9819 przypadków.

Wyświetlona zostanie teraz liczba niekompletnych wierszy w całym zbiorze (co najmniej jedna brakująca wartość).

[1] 9591

Takich wierszy jest 9591.

Usunięcie niemal dziesięcu tysięcy ze zbioru uważam za złą praktykę. Każdy z nich zawiera pewne informacje o pasażerach, które są cenne w analizie. Posatram się je zatem uzupełnić, stosując odpowiednią technikę.

Przykładowe sposoby imputacji braków danych to imputacja średnią, medianą, elementem najczęściej występujacym lub metodą \(k\)-najbliższych sąsiadów.

Przed zdecydowaniem się na konkretną metodę imputacji, przyjrzę się zależnościom między zmiennymi oraz zbadam ich rozkłady.

Na podstawie widocznej wyżej macierzy korelacji, warto zauważyć silną korelację pomiędzy zmienną Arrival.Delay.in.Minutes oraz Departure.Delay.in.Minutes. Jest to korelacja naturalna, ponieważ oczywiste jest, że opóźnienie wylotu samolotu związane jest z opóźnienniem jego przylotu, jednak ostatecznie w modelowaniu warto uwzględnić tylko jedną z nich, aby nie przekazywać nadmiarowych informacji.

Dla zmiennych kategorycznych widoczne są silne korelacje pomiędzy zmiennymi Cleanliness i Seat.comfort oraz Inflight.enternainment, a także silna korelacja pomiędzy zmiennymi Ease.of.Online.booking i Inflight.wifi.service. Zmienna wynikowa safisfaction najsilniejszą korelację ma ze zmiennymi Class oraz Online.boarding, z pozostałymi zmiennymi ma ona słabe korelacje.

Na przyszłość można rozszerzyć to badanie o przeprowadzenie metody PCA dla wysokoskorelowanych par zmiennych.

Rozkłady zmiennych

Poniżej zaprezentowano rozkłady zmiennych numerycznych oraz kategorycznych.

Na podstawie powyższych wykresów wnioskujemy, że:

  • płeć pasażerów jest zbalansowana, co oznacza, że liczebność kobiet i mężczyzn jest bardzo podobna,

  • widoczne jest niezbalansowanie zmiennych Customer.Type, Type.of.Travel oraz Class,

  • zmienna satisfaction nie jest zbalansowana, ale też nie ma znaczącej różnicy pomiędzy liczebnością pasażerów usatysfakcjonowanych, a neutralnie- lub nieusatysfakcjonowanych,

  • widoczna jest symetria rozkładu zmiennej Age - jest on zbliżony do rozkładu normalnego - zostało to także wstępnie przewidziane wcześniej, na etapie statystyk opisowych,

  • widoczna jest prawostronna asymetria rozkładu zmiennych Arrival.Deyal.in.Minutes, Departure.Delay.in.Minutes oraz Flight.Distance,

  • widoczna jest lewostronna asymetria rozkładów zmiennych Arrival.time.convenient, Food.and.drink, Online.borading, Seat.comfort , Inflight.entertainment, On.board.service, Leg.room.service, Baggage.handling, Checkin.service, Inflight.service oraz Cleanliness,

  • widoczne są także wartości odstające (szczególnie dla zmiennej Customer.Type).

Ze względu na asymetrię rozkładów zmiennych ilościowych, odrzucam dla nich imputację metodą najczęściej występującej wartości. Zastosuję dla nich dwie metody imputacji - \(k\)-najbliższych sąsiadów (tu 5) oraz zastępowanie braków danych medianą (później przetestuję wyniki modelu na zbiorach z alternatywnymi sposobami imputacji danych celem porównania). Do zmiennych jakościowych zastosuję uzupełnianie braków danych najczęściej występującą wartością.

[1] 0
[1] 0

Wartości odstające

W tej części badania zostaną zbadane oraz zidentyfikowane wartości odstające.

Za pomocą funkcji nearZeroVar() zidentyfikować można predyktory, które mają bardzo mało unikalnych wartości w stosunku do ich liczby, a stosunek częstotliwości najczęściej występującej wartości do częstotliwości drugiej najczęściej występującej wartości jest duży.

[1] 21 22
Departure.Delay.in.Minutes Arrival.Delay.in.Minutes
25 18
1 6
0 0
11 9
0 0
0 0

Tutaj takimi predyktorami są zmienne Departure.Delay.in.Minutes oraz Arrival.Delay.in.Minutes.

$linearCombos
list()

$remove
NULL

Brak jest również w tym zbiorze danych kombinacji liniowych pomiędzy predyktorami.

Poniżej przedstawiono wykresy ramka-wąsy dla zmiennych numerycznych w tym zbiorze.

Zauważyć można niesymetryczność rozkładów niektórych zmiennych, które były widoczne także na poprzednich wizualizacjach. Widać także dużo obserwacji, które zostały sklafyfikowane jako odstające na podstawie zasady rozstępu ćwiartkowego.

Teraz, za pomocą funkcji identify_outliers(), zidentyfukowane zostaną wartości odstające.

Obserwacje zidentyfikowane jako odstające pochodzą ze zmiennych Arrival.Delay.in.Minutes - 8618, Departure.Delay.in.Minutes - 9276, Flight.Distance - 2329, Customer.Type - 18907. Łącznie zatem takich obserwacji jest niemal 40 tysięcy. Niepoprawnym byłoby usunięcie wszystkich tych obserwacji, ponieważ stanowią one znaczną część załego zbioru danych. Na ten moment decyduję się na nie podejmowanie żadnych kroków pod tym względem.

W związku z tym, że około 40% zbioru zostało zakwalifikowane jako wartości odstające, a imputacja braków danych medianą jest odporna na wartości odstające, pokazuje to dobry wybór co do właśnie tej metody imputacji.

Dodatkowe wizualizacje

Na podstawie tego wykresu można powiedzieć, że najczęściej usatysfakcjonowane były osoby starsze (w wieku 40-60 lat). Drugą grupę w znacznej mierze reprezentują pasażerowanie w wieku 20-40 lat.

Wśród badanych pasażerów, zarówno w grupie usatysfakcjonowanych, jak i neutralnych lub nieusatysfakcjonowanych, podział płci był rówomiernie rozłożony.

Na podstawie powyższego wykresu można powiedzieć, że największym zainteresowaniem w każdej grupie wiekowej cieszyła się klasa Eco. Klasy Bisuness oraz Eco Plus wybierała podobna liczba pasażerów.

Przygotowanie danych do budowy modelu

Wybór danych do modelu

Należy uwzględnić predyktory, które są silnie skorelowane ze zmienną docelową i nie są skorelowane ze sobą.

Na ten moment decyduję się na nie uwzględnienie w modelu zmiennej Departure.Delay.in.Minutes, ponieważ była ona bardzo silnie skorelowana ze zmienną Arrival.Delay.in.Minutes.

Preprocessing

W kolejnych korkach preprocessingu podzielimy dane na zbiór uczący i testowy, dokonamy transformacji rozkładów predyktorów do rozkładu normalnego oraz normalizacji predyktorów. Ponieważ planuję sprawdzić różne modele, a każdy z nich wymaga nieco innego preprocessingu, to przygotuję różne formuły transformacji danych - odpowiednie dla poszczególnych modeli.

Budowa modeli

Najpierw wyznaczymy tzw. model bazowy. Używa się go do sprawdzenia, czy modele uczenia maszynowego faktycznie przewyższają dopasowaniem model bazowy. Tylko wtedy warto je rozważać.

Do oceny jakości dopasowania użyjemy dwóch miar accuracy oraz specificity. Oceny dopasowania dokonamy z wykorzystaniem sprawdzianu krzyżowego 5-krotnego bez powtórzeń.

.metric .estimator mean n std_err .config
accuracy binary 0.5666694 5 0.0013454 Preprocessor1_Model1
spec binary 0.0000000 5 0.0000000 Preprocessor1_Model1
.metric .estimator mean n std_err .config
accuracy binary 0.5666694 5 0.000992 Preprocessor1_Model1
spec binary 0.0000000 5 0.000000 Preprocessor1_Model1

Na ten moment średnie wyniki miary accuracy dla obu wariantów danych (różne metody imputacji braków danych) dla modelu bazowego wynoszą około 57%.

Zbudowane teraz zostaną różne modele - lasu losowego, drzewa decyzyjnego, modelu \(k\)-najbliższych sąsiadów, regresji logistycznej, modelu SVM oraz sieci neuronowej.

# A workflow set/tibble: 12 × 4
   wflow_id        info             option    result    
   <chr>           <list>           <list>    <list>    
 1 recipe_1_svm    <tibble [1 × 4]> <opts[0]> <list [0]>
 2 recipe_1_rf     <tibble [1 × 4]> <opts[0]> <list [0]>
 3 recipe_1_knn    <tibble [1 × 4]> <opts[0]> <list [0]>
 4 recipe_1_rpart  <tibble [1 × 4]> <opts[0]> <list [0]>
 5 recipe_1_logreg <tibble [1 × 4]> <opts[0]> <list [0]>
 6 recipe_1_neural <tibble [1 × 4]> <opts[0]> <list [0]>
 7 recipe_2_svm    <tibble [1 × 4]> <opts[0]> <list [0]>
 8 recipe_2_rf     <tibble [1 × 4]> <opts[0]> <list [0]>
 9 recipe_2_knn    <tibble [1 × 4]> <opts[0]> <list [0]>
10 recipe_2_rpart  <tibble [1 × 4]> <opts[0]> <list [0]>
11 recipe_2_logreg <tibble [1 × 4]> <opts[0]> <list [0]>
12 recipe_2_neural <tibble [1 × 4]> <opts[0]> <list [0]>

Dopasowanie do zbioru treningowego:

# A tibble: 24 × 9
   wflow_id        .config  preproc model .metric .estimator  mean     n std_err
   <chr>           <chr>    <chr>   <chr> <chr>   <chr>      <dbl> <int>   <dbl>
 1 recipe_1_svm    Preproc… recipe  svm_… accura… binary     0.955     5 7.38e-4
 2 recipe_1_svm    Preproc… recipe  svm_… specif… binary     0.932     5 1.05e-3
 3 recipe_1_rf     Preproc… recipe  rand… accura… binary     0.960     5 9.27e-4
 4 recipe_1_rf     Preproc… recipe  rand… specif… binary     0.939     5 7.78e-4
 5 recipe_1_knn    Preproc… recipe  near… accura… binary     0.930     5 8.68e-4
 6 recipe_1_knn    Preproc… recipe  near… specif… binary     0.908     5 1.15e-3
 7 recipe_1_rpart  Preproc… recipe  deci… accura… binary     0.888     5 3.64e-3
 8 recipe_1_rpart  Preproc… recipe  deci… specif… binary     0.906     5 2.73e-3
 9 recipe_1_logreg Preproc… recipe  logi… accura… binary     0.933     3 7.50e-4
10 recipe_1_logreg Preproc… recipe  logi… specif… binary     0.912     3 1.63e-3
# ℹ 14 more rows
# A tibble: 24 × 9
   wflow_id        .config  preproc model .metric .estimator  mean     n std_err
   <chr>           <chr>    <chr>   <chr> <chr>   <chr>      <dbl> <int>   <dbl>
 1 recipe_1_svm    Preproc… recipe  svm_… accura… binary     0.954     5 1.28e-3
 2 recipe_1_svm    Preproc… recipe  svm_… specif… binary     0.930     5 2.37e-3
 3 recipe_1_rf     Preproc… recipe  rand… accura… binary     0.959     5 1.07e-3
 4 recipe_1_rf     Preproc… recipe  rand… specif… binary     0.935     5 1.88e-3
 5 recipe_1_knn    Preproc… recipe  near… accura… binary     0.928     5 8.65e-4
 6 recipe_1_knn    Preproc… recipe  near… specif… binary     0.906     5 1.51e-3
 7 recipe_1_rpart  Preproc… recipe  deci… accura… binary     0.896     5 1.67e-3
 8 recipe_1_rpart  Preproc… recipe  deci… specif… binary     0.901     5 1.49e-3
 9 recipe_1_logreg Preproc… recipe  logi… accura… binary     0.932     3 1.09e-3
10 recipe_1_logreg Preproc… recipe  logi… specif… binary     0.914     3 3.04e-3
# ℹ 14 more rows

Najlepsze wartości dopasowania uzyskał model lasu losowego (96% miary accuracy). Na bardzo zbliżonym poziomie do tego pozostały także wyniki modelu SVM. Warto również zaznaczyć, że przewyższają one zdecydowanie jakością dopasowania model bazowy.

Należy także zwrócić uwagę, że wyniki models2 oparte są na zestawie danych, gdzie metodą imputacji braków danych była metoda 5-najbliższych sąsiadów. Wyniki dla dopasowania modeli dla tych danych wypadają bardzo podobnie do tych, gdzie braki danych były uzupełniane medianą. Różnice są na 3. miejscu po przecinku (z przewagą dla metody uzupełniania bd medianą).

Tuning modeli

W tej części pracy przeprowadzona zostanie optymalizacja parametrów najlepszego modelu. Do optymalizacji zostanie wykorzystana metoda przeszukiwania siatki. Tuningowany będzie model lasu losowego. Od tej pory będziemy też pracować tylko na zbiorze dane, gdzie imputacja braków danych przebiegała z użyciem mediany.

# A tibble: 5 × 9
   mtry trees min_n .metric  .estimator  mean     n  std_err .config            
  <int> <int> <int> <chr>    <chr>      <dbl> <int>    <dbl> <chr>              
1    15  1790     8 accuracy binary     0.961     5 0.000489 Preprocessor1_Mode…
2    10  1578    20 accuracy binary     0.961     5 0.000466 Preprocessor1_Mode…
3    13   126    15 accuracy binary     0.961     5 0.000446 Preprocessor1_Mode…
4     7  1151    11 accuracy binary     0.961     5 0.000580 Preprocessor1_Mode…
5    17   209    25 accuracy binary     0.961     5 0.000333 Preprocessor1_Mode…

W wyniku przeszukiwania siatki, otrzymano 5 propozycji optymalnych hiperparametrów modelu lasu losowego; każda z nich ma średnią miarę accuracy wynoszącą 0,96.

Ocena dopasowania modelu końcowego

Jako najlepsze hiperparametry modelu zostaną wybrane te na pozycji pierwszej.

══ Workflow ════════════════════════════════════════════════════════════════════
Preprocessor: Recipe
Model: rand_forest()

── Preprocessor ────────────────────────────────────────────────────────────────
2 Recipe Steps

• step_best_normalize()
• step_normalize()

── Model ───────────────────────────────────────────────────────────────────────
Random Forest Model Specification (classification)

Main Arguments:
  mtry = 15
  trees = 1790
  min_n = 8

Computational engine: ranger 

Dopasowanie do zbioru testowego.

[[1]]
# A tibble: 3 × 4
  .metric     .estimator .estimate .config             
  <chr>       <chr>          <dbl> <chr>               
1 accuracy    binary        0.962  Preprocessor1_Model1
2 roc_auc     binary        0.994  Preprocessor1_Model1
3 brier_class binary        0.0280 Preprocessor1_Model1

Dopasowanie do danych testowych na podstawie miary accuracy wynosi 0,96. Pole pod krzywą ROC wynosi niemal 1.

Poniżej przedstawiono macierz klasyfikacji.

          Truth
Prediction     0     1
         0 17306   815
         1   358 12693

Podsumowanie

Model lasu losowego ze stuningowanymi hiperparametrami poskutkował 96% dopasowaniem do danych testowych. Na przyszłość można rozważyć także tuning pozostałych równie dobrze dopasowanych modeli, który nie został tutaj wdrożony.